Android Native内存分析,systrace, |
您所在的位置:网站首页 › 安卓 native内存占1G › Android Native内存分析,systrace, |
一,Google官方的调试本地内存工具: https://source.android.com/devices/tech/debug/native-memory 1.malloc debug: adb shell setprop wrap.com.***.***'"LIBC_DEBUG_MALLOC_OPTIONS=backtrace\ leak_track\ logwrapper"' adb shell am force-stop com.***.*** 关掉应用,再打开 adb shell am dumpheap -n PID /data/local/tmp/heap.txt 开启后,apk运行太慢。 2.malloc hook: adb shell setprop wrap.com.***.***'"LIBC_HOOKS_ENABLE=1"' adb shell setprop wrap.com.***.***'"LIBC_DEBUG_MALLOC_OPTIONS=backtrace logwrapper"' adb shell setprop wrap.com.***.***'"LIBC_HOOKS_ENABLE=1 leak_track logwrapper"' adb shell am force-stop com.***.*** adb shell am dumpheap -n PID /data/local/tmp/heap.txt 开启后,apk运行太慢。 3.HeapSnapshot: https://github.com/albuer/heapsnap https://blog.csdn.net/lin20044140410/article/details/107893098 需要把开源库中的源码编译出可执行文件,库。编译时,开源库中缺少以下依赖库:libbase.so,libc_malloc_debug.so,libc++.so,libdexfile_support.so,libdl.so,liblzma.so,libunwindstack.so 可以从手机导出,或者下载AndroidAOSP源码自己编译出相关库。 使用编译出的文件,在Demo中没能检测到native内存泄漏,后续再看看。 4.Address Sanitizer: 安装时提示,手机设备不支持。 基于LeakTracer的内存泄漏检测工具: LeakTracer文档 : http://www.andreasen.org/LeakTracer/ https://github.com/fredericgermain/LeakTracer 这是我本地调试OK的,可以在android studio上运行的Leak Tracer :https://github.com/whcx/LeakTracerAndroid.git 导出: libnative_heap.so ,native_heap.txt ,库的名字,dump内存文件名注意跟cmakelist中, writeLeaksResultToFile方法中的命名一致。执行命令:./leak-analyze-addr2line64 libleaktracer.so native_heap.txt >info.txt,解析疑似内存泄漏的调用堆栈。
附:调试工具参数 二,MemInfo, adb shell dumpsys meminfo pkgname|pid -d Private(Clean and Dirty) RAM, 进程使用的内存,进程销毁后系统可回收的RAM容量, PSS proportional set size, 实际使用的物理内存,比例分享共享库占用的内存,考虑了进程之间共享RAM的情况, DalvikHeap,应用中dalvik分配所占用的RAM,Pss total包括所有zygote分配,private dirty是仅分配给你应用堆得实际RAM,包含了您自己的分配和任何zygote分配页。 Heap alloc,是dalvik和原生堆分配器为你的应用记录的内存占用量,此值大于pss total, private dirty,因为你的进程是从zygote孵化而来,所以他包含了你的进程和其他的进程的共享分配。 .so mmap, .dex mmap,这块内存用于映射 .so(native)和.dex(dalvik/art)代码占用的RAM,Pss total 值包括应用之间共享的平台代码,Private clean是你应用自己的代码, 通常实际映射的内存容量要大得多,此处的RAM只是应用已经执行的代码当前需要占用的RAM。 .oat mmap,这个等同于代码镜像占用的RAM,它是基于被多个应用预加载的类来计算的,这个镜像在所有应用之间共享,不受特定应用影响。 .art mmap, 这个等同于堆镜像占用的RAM,它是基于被多个应用预加载的类来计算,此镜像在所有应用之间共享,不受特定应用影响,即使ART镜像包含Object实例,也不会计入你的堆空间。 Unkown, 系统无法将其分类到其他更具体的一项RAM页,当前,此类RAM页主要包含native分配,工具在收集此数据时无法识别这些分配。 ViewRootImpl,当前进程中,处于活动状态的跟实图数量,每个根视图都与一个窗口关联。 AppContexts, Activities, 当前进程中,当前处于活跃状态的应用上下文,和activity对象数量。
三,systrace 1,adb shell dumpsys gfxinfo com.gritworld.arexample 2,systrace命令行 python版本27. 在C:\Users\jianlin\AppData\Local\Android\Sdk\platform-tools\systrace 目录下执行命令: python systrace.py -b 16384 -t 8 gfx input view webview sm hal idle freq sched wm am res dalvik disk sync -o mytrace.html --------------- gfx - Graphics input - Input view - View System webview - WebView wm - Window Manager am - Activity Manager sm - Sync Manager audio - Audio video - Video camera - Camera hal - Hardware Modules res - Resource Loading dalvik - Dalvik VM rs - RenderScript bionic - Bionic C Library power - Power Management pm - Package Manager ss - System Server database - Database network - Network adb - ADB vibrator - Vibrator aidl - AIDL calls pdx - PDX services sched - CPU Scheduling irq - IRQ Events i2c - I2C Events freq - CPU Frequency idle - CPU Idle disk - Disk I/O sync - Synchronization workq - Kernel Workqueues memreclaim - Kernel Memory Reclaim regulators - Voltage and Current Regulators binder_driver - Binder Kernel driver binder_lock - Binder global lock trace pagecache - Page cache ------------- 在app添加自己的systrace log Trace.traceBegin("performTraversals"); try { …… } finally { Trace.traceEnd(); } 需要保证 traceBegin 与 traceEnd 一定要成对出现。 并且一定要在同一个线程里面 ------------------ systrace.py 命令参数 -h, --help show this help message and exit -o FILE write HTML to FILE -t N, --time=N trace for N seconds -b N, --buf-size=N use a trace buffer size of N KB -k KFUNCS, --ktrace=KFUNCS specify a comma-separated list of kernel functions to trace -l, --list-categories list the available categories and exit -a APP_NAME, --app=APP_NAME enable application-level tracing for comma-separated list of app cmdlines --no-fix-threads don't fix missing or truncated thread names --no-fix-tgids Do not run extra commands to restore missing thread to thread group id mappings. --no-fix-circular don't fix truncated circular traces --no-compress Tell the device not to send the trace data in compressed form. --link-assets (deprecated) --boot reboot the device with tracing during boot enabled. The report is created by hitting Ctrl+C after the device has booted up. --from-file=FROM_FILE read the trace from a file (compressed) rather than running a live trace --asset-dir=ASSET_DIR (deprecated) -e DEVICE_SERIAL, --serial=DEVICE_SERIAL adb device serial number --agent-dirs=AGENT_DIRS the directories of additional systrace agent modules. The directories should be comma separated, e.g., --agent-dirs=dir1,dir2,dir3. Directory |agents| is the default agent directory and will always be checked. --target=TARGET chose tracing target (android or linux)
|
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |